﻿using System;
using System.Data;
using System.Data.SqlClient;
using System.Drawing;
using System.Windows.Forms;

namespace Operacional
{
    public partial class frmLinhas : Form
    {
        #region Declarações

        public static string numLinha;
        public static SqlDataAdapter daLinhas;
        public static DataView dvTarefas, dvLinhasTarefas;
        private readonly frmEntrada _entrada = new frmEntrada();
        private frmManutencao _manutenção;
        readonly frmEmProducao _emProducao = new frmEmProducao { MdiParent = Program.entrada };
        readonly frmDisplay _display = new frmDisplay { MdiParent = Program.entrada };
        private PedeOrdemProd _ordemProducao;
        private Tempos _times;

        #endregion

        public frmLinhas()
        {
            InitializeComponent();            
        }

        private void frmLinhas_Load(object sender, EventArgs e)
        {
            Dock = DockStyle.Fill;            

            frmEntrada.tmrLogin.Enabled = false;
            
            btnLegenda.Text = "XX\nXXX\nHH:MM";
            _entrada.lblStatusText("Utilizador: " + frmEntrada.dvUsers[0][1]);
            Program.entrada.lblStatus.Text = string.Format("Utilizador: {0}", frmEntrada.dvUsers[0][1]);

            if (frmEntrada.dsFilkemp.Tables["dtLinhas"] != null) frmEntrada.dsFilkemp.Tables["dtLinhas"].Clear();
            daLinhas = new SqlDataAdapter("Select * from Linhas", frmEntrada.conn);
            daLinhas.Fill(frmEntrada.dsFilkemp.Tables["dtLinhas"]);

            #region Cria Botoes

            // Off sets
            int y = 0;
            int x = 0;
            for (int intLoop = 0; intLoop < frmEntrada.dsFilkemp.Tables["dtLinhas"].Rows.Count; intLoop++)
            {
                DataRow drLinhas = frmEntrada.dsFilkemp.Tables["dtLinhas"].Rows[intLoop];

                Button newbutton = new Button
                {
                    Font = new Font("Arial", 18, FontStyle.Bold),
                    FlatStyle = FlatStyle.System,
                    Width = 120,
                    Height = 120,
                    Text = drLinhas["Prod_Lin"].ToString(),
                    Name = "bt" + drLinhas[0]
                };

                if (intLoop % 5 == 0)
                {
                    if (intLoop == 0) y = 10;
                    else y += newbutton.Height + 10;
                    x = 0;
                }

                newbutton.Top = y;
                newbutton.Left = 10 + (x * (newbutton.Width + 10));
                x += 1;

                newbutton.Click += btnClk;//Adiciona Evento a Botao Criado
                pnlLinhas.Controls.Add(newbutton);
            }
            #endregion

            if (frmEntrada.dsFilkemp.Tables["dtLinhas_Tarefas"] != null) frmEntrada.dsFilkemp.Tables["dtLinhas_Tarefas"].Clear();
            frmEntrada.daLinhasTarefas.Fill(frmEntrada.dsFilkemp.Tables["dtLinhas_Tarefas"]);
            dvLinhasTarefas = new DataView(frmEntrada.dsFilkemp.Tables["dtLinhas_Tarefas"]) { Sort = "Data Asc" };

            frmEntrada.daTarefas.Fill(frmEntrada.dsFilkemp.Tables["dtTarefas"]);
            dvTarefas = new DataView(frmEntrada.dsFilkemp.Tables["dtTarefas"]);

            _ordemProducao = new PedeOrdemProd();

            tmr.Enabled = true;
            tmr.Start();
            tmr_Tick(sender, e);
        }

        private void btnClk(Object sender, EventArgs e)
        {
            tmr.Stop();
            tmr.Enabled = false;

            numLinha = ((Button)sender).Text.Substring(0, 2);
            Program.entrada.lblStatus.Text = string.Format("Utilizador: {0}", frmEntrada.dvUsers[0][1]);
            
            dvLinhasTarefas.RowFilter = string.Format("Linha={0}", numLinha);

            if (dvLinhasTarefas.Count > 0)
            {
                string estado = dvLinhasTarefas[dvLinhasTarefas.Count - 1]["Estado"].ToString();
                #region Já tem registos na tabela_Linhas Tarefas

                switch (estado)
                {
                    case "Virada":
                        _emProducao.Show();
                        Close();
                        break;

                    #region Em Producao
                    case "Em Producao":
                        _emProducao.Show();
                        Close();
                        break;
                    #endregion

                    #region Fim de Producao
                    case "Fim de Producao":
                        _ordemProducao = new PedeOrdemProd();
                        _ordemProducao.mostraProducao();
                        Close();
                        break;
                    #endregion

                    #region Tarefa Iniciada
                    case "I":
                        _display.Show();
                        Close();
                        Dispose();
                        break;
                    #endregion

                    #region Fim de Tarefa
                    case "F":
                        dvLinhasTarefas.RowFilter = string.Format("Linha Like '{0}' and (Estado='Em Producao' or Estado='Fim Producao')", numLinha);
                        if (dvLinhasTarefas.Count > 0 && dvLinhasTarefas[dvLinhasTarefas.Count - 1]["Estado"].ToString() == "Em Producao") _emProducao.Show();
                        else
                        {
                            _ordemProducao.mostraProducao();
                            Close();
                        }
                        break;
                    #endregion

                    #region Arranque Linha
                    case "ArranqueLinha":
                        dvLinhasTarefas.RowFilter = string.Format("[Linha] = '{0}' and ([Estado] = 'I' or [Estado] = 'F' )", numLinha);
                        if (dvLinhasTarefas.Count > 0 && dvLinhasTarefas[dvLinhasTarefas.Count - 1]["Estado"].ToString() == "I")
                        {
                            _display.Show();
                            Close();
                            Dispose();
                        }
                        else
                        {
                            dvLinhasTarefas.RowFilter = string.Format("Linha={0} and (Estado='Em Producao' or Estado='Fim Producao')", numLinha);
                            if (dvLinhasTarefas.Count > 0 && dvLinhasTarefas[dvLinhasTarefas.Count - 1]["Estado"].ToString() == "Em Producao") _emProducao.Show();
                            else _ordemProducao.mostraProducao();
                        }
                        break;
                    #endregion
                    default:
                        if (estado.Length > 1 && estado.Substring(0, 3) == "Ped")
                        {
                            _manutenção = new frmManutencao{MdiParent = Program.entrada};
                            _manutenção.Show();
                            Close();
                        }
                        break;
                }
            }
                #endregion
            else
            {
                _ordemProducao = new PedeOrdemProd();
                _ordemProducao.mostraProducao();
            }
        }

        #region Timer to change Color of Buttons

        private void tmr_Tick(object sender, EventArgs e)
        {
            if (pnlLinhas.Controls.Count <= 0 || !tmr.Enabled) return;

            foreach (Button btn in pnlLinhas.Controls)
            {
                numLinha = btn.Text.Substring(0, 2);
                
                dvLinhasTarefas.RowFilter = string.Format("[Linha]='{0}'", numLinha);
                if (dvLinhasTarefas.Count > 0)
                {                   
                    string estado = dvLinhasTarefas[dvLinhasTarefas.Count - 1]["Estado"].ToString();
                    switch (estado)
                    {                        
                        case "Virada":
                            btn.ForeColor = Color.White;
                            btn.Font = new Font("Arial", 16, FontStyle.Bold);
                            btn.Text = numLinha + "\n" + _ordemProducao.calculaTempoVirada();
                            btn.FlatStyle = FlatStyle.Standard;
                            btn.BackColor = Color.Blue;
                            break;
                            
                        case "Em Producao":
                            btn.ForeColor = Color.White;
                            btn.Font = new Font("Arial", 16, FontStyle.Bold);
                            btn.Text = numLinha + "\n" + _ordemProducao.calculaTempoVirada();
                            btn.FlatStyle = FlatStyle.Standard;
                            btn.BackColor = Color.Blue;
                            break;                        

                        case "I":
                            _times = new Tempos();
                            mudaCor(btn);
                            break;

                        #region "Tarefa Terminada"
                        case "F":
                            dvLinhasTarefas.RowFilter =
                                string.Format("Linha Like '{0}' And (Estado='Em Producao' Or Estado='Fim Producao')", numLinha);
                            if (dvLinhasTarefas.Count > 0)
                            {
                                if (dvLinhasTarefas[dvLinhasTarefas.Count - 1]["Estado"].ToString() == "Em Producao")
                                {
                                    btn.ForeColor = Color.White;
                                    btn.Font = new Font("Arial", 16, FontStyle.Bold);
                                    btn.Text = numLinha + Environment.NewLine + _ordemProducao.calculaTempoVirada();
                                    btn.FlatStyle = FlatStyle.Standard;
                                    btn.BackColor = Color.Blue;
                                }
                            }
                            break;
                        #endregion

                        #region "Arranque de Linha"
                        case "ArranqueLinha":
                            dvLinhasTarefas.RowFilter = string.Format("Linha Like '{0}' And (Estado='I' Or Estado='F')", numLinha);
                            if (dvLinhasTarefas.Count > 0)
                            {
                                estado = dvLinhasTarefas[dvLinhasTarefas.Count - 1]["Estado"].ToString();
                                if (estado == "I")
                                {
                                    _times = new Tempos();
                                    mudaCor(btn);
                                }
                                else
                                {
                                    dvLinhasTarefas.RowFilter = string.Format("Linha Like '{0}' And (Estado='Em Producao' Or Estado='Fim de Producao')", numLinha);
                                    estado = dvLinhasTarefas[dvLinhasTarefas.Count - 1]["Estado"].ToString();
                                    if (estado == "Em Producao")
                                    {
                                        btn.ForeColor = Color.White;
                                        btn.Font = new Font("Arial", 16, FontStyle.Bold);                                        
                                        btn.Text = numLinha + Environment.NewLine + _ordemProducao.calculaTempoVirada();
                                        btn.FlatStyle = FlatStyle.Standard;
                                        btn.BackColor = Color.Blue;
                                    }
                                }
                            }
                            else
                            {
                                dvLinhasTarefas.RowFilter =
                                    string.Format("Linha Like '{0}' And (Estado='Em Producao' Or Estado='Fim de Producao')", numLinha);
                                estado = dvLinhasTarefas[dvLinhasTarefas.Count - 1]["Estado"].ToString();
                                if (estado == "Em Producao")
                                {
                                    btn.ForeColor = Color.White;
                                    btn.Font = new Font("Arial", 16, FontStyle.Bold);
                                    _ordemProducao = new PedeOrdemProd();
                                    btn.Text = numLinha + Environment.NewLine + _ordemProducao.calculaTempoVirada();
                                    btn.FlatStyle = FlatStyle.Standard;
                                    btn.BackColor = Color.Blue;
                                }
                            }
                            break;
                        #endregion

                        default:
                            if (estado.IndexOf("Ped") != -1)
                            {
                                btn.FlatStyle = FlatStyle.Standard;
                                btn.BackColor = Color.BlueViolet;
                            }
                            break;
                    }
                }
                else btn.FlatStyle = FlatStyle.System;
            }
        }

        #endregion

        private void mudaCor(Button btn)
        {
            _times.AvgTimes_();
            _times.Duracao_();
            double dDuracao = _times.Duracao.TotalSeconds;
            double dMedia = _times.Media.TotalSeconds;

            btn.FlatStyle = FlatStyle.Standard;
            if (dDuracao > dMedia && dMedia > 0)
                btn.BackColor = (dDuracao > dMedia + 0.25 * dMedia) ? Color.Red : Color.Orange;
            else if (_times.Duracao.ToString() != "00:00:00") btn.BackColor = Color.Green;
        }
    }
}
